//File  : data_type.go
//Author: rockywish
//Date  : 2020-03-22
package main

import "fmt"

func main() {
	BasicDataType()
	//CompositeDataType()
}

/**
基本数据类型
*/
func BasicDataType() {
	/*
		%T 是占位符 输出数据类型
		\n 换行符
	*/
	//int
	var rockywish_age int = 18 // 重点**默认的int是有符号的64位
	fmt.Printf("数据类型是%T \n", rockywish_age)
	/*
		unsigned无符号，无符号全是正数
		一个字节8位 00001111
		uint8 	1个字节  0--255	 00000000--11111111
		uint16 	2个字节  0--65535
		uint32 	4个字节	0--4294967295  将近43亿
		uint64 	8个字节	0- 天文数字  43亿*43亿
	*/
	/*
		最高位是符号位 0表示正数、1表示负数
		int8 	1个字节  -128 -- 127  10000000 -- 01111111
		int16 	2个字节  -32768 -- 32767
		int32 	4个字节 -21.5亿 -- 21.5亿
		int64 	8个字节
	*/

	//float 默认64位
	var price1 float32 = 789.123
	var price2 float64 = 123.567
	fmt.Printf("price1数据类型是%T  值是 %v \n", price1, price1)
	fmt.Printf("price2数据类型是%T  值是 %v \n", price2, price2)

	//string
	fmt.Printf("数据类型是%T \n", "rockywish")
	//bool
	fmt.Printf("数据类型是%T \n", true)
}

/**
复合数据类型
*/
func CompositeDataType() {
	/*
		定义：3长度的整型数组
		可以存放5个整型，长度是不允许变的
	*/
	fmt.Printf("数据类型是%T \n", [3]int{0, 1, 2})

	/*
		切片 长度是不固定的可以动态扩容
	*/
	fmt.Printf("数据类型是%T \n", []int{3, 4, 5, 6, 7})

	/*
		Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据，key 类似于索引，指向数据的值。
		定义map string作为键，int作为值
		map[string]int 从string到int的映射
	*/
	rockywish_map := make(map[string]int)
	rockywish_map["age"] = 18

	fmt.Printf("rockywish_map[\"age\"]的值是 %v \n", rockywish_map["age"])
	fmt.Printf("数据类型是%T \n", rockywish_map)

	/*
		指针
	*/
	// &取地址符
	//*int，整型指针值的地址，存储一个int值的地址
	var rockywish_age = 18
	fmt.Printf("数据类型是%T \n", &rockywish_age)
	fmt.Printf("&rockywish_age值是 %v \n", &rockywish_age)

	/*
		结构体
	*/
	type Cars struct {
		name      string
		price     int
		kilometre float64
	}
	//car := Cars{"BMW", 10000, 100.5}
	var car Cars = Cars{"AD", 20000, 90.99}
	fmt.Printf("car 的类型是 %T \n", car)
}
